package com.yociyy.admin.biz;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.crypto.SecureUtil;
import com.yociyy.admin.mapper.BaseUserMapper;
import com.yociyy.admin.mapper.BaseUserPostMapper;
import com.yociyy.admin.mapper.BaseUserRoleMapper;
import com.yociyy.admin.model.constant.UserConstants;
import com.yociyy.admin.model.entity.BaseUser;
import com.yociyy.admin.model.entity.BaseUserPost;
import com.yociyy.admin.model.entity.BaseUserRole;
import com.yociyy.common.utils.EntityHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;
import tk.mybatis.mapper.weekend.WeekendSqls;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 用戶信息 Biz
 * 
 * @author YoCiyy
 * @date 2019-12-12
 */
@Service
@Transactional(rollbackFor = Exception.class)
public class BaseUserBiz {

	@Autowired
	private BaseUserMapper userMapper;

	@Autowired
	private BaseUserPostMapper userPostMapper;

	@Autowired
	private BaseUserRoleMapper userRoleMapper;

	/**
	 * 用户分页
	 * 
	 * @param params 查询条件
	 * @return 用户分页信息
	 */
	public List<BaseUser> selectUserList(Map<String, Object> params) {
		// 条件查询
		return userMapper.selectUserList(params);
	}

	/**
	 * 新增用户信息，用户岗位关联，用户角色关联
	 *
	 * @param baseUser 用户信息
	 */
	public void insertUser(BaseUser baseUser) {
		// 用户密码加密(默认密码为123456)
		String pwd = SecureUtil.md5("123456");
		baseUser.setPassword(new BCryptPasswordEncoder(UserConstants.PW_ENCORDER_SALT).encode(pwd));
		// 填充注入数据库基础字段信息
		EntityHelper.assembleCrtFields(baseUser);
		// 新增用户信息
		userMapper.insertSelective(baseUser);
		// 用户岗位关联
		this.insertUserPost(baseUser);
		// 用户角色关联
		this.insertUserRole(baseUser);
	}

	/**
	 * 校验用户名称是否唯一
	 *
	 * @param loginName 用户名
	 * @return 结果
	 */
	public String checkUsernameUnique(String loginName) {
		int count = userMapper.checkUsernameUnique(loginName);
		// if (count > 0) {
		// return UserConstants.USER_NAME_NOT_UNIQUE;
		// }
		// return UserConstants.USER_NAME_UNIQUE;
		return null;
	}

	/**
	 * 新增用户角色信息
	 *
	 * @param baseUser 用户对象
	 */
	public void insertUserRole(BaseUser baseUser) {
		List<Long> roles = baseUser.getRoleIds();
		if (ObjectUtil.isNotNull(roles)) {
			// 新增用户与角色管理
			List<BaseUserRole> list = new ArrayList<BaseUserRole>();
			for (Long roleId : roles) {
				list.add(new BaseUserRole().setUserId(baseUser.getId()).setRoleId(roleId));
			}
			if (list.size() > 0) {
				userRoleMapper.batchInsertUserRole(list);
			}
		}
	}

	/**
	 * 新增用户岗位信息
	 *
	 * @param baseUser 用户对象
	 */
	public void insertUserPost(BaseUser baseUser) {
		List<Long> posts = baseUser.getPostIds();
		if (ObjectUtil.isNotNull(posts)) {
			// 新增用户与岗位管理
			List<BaseUserPost> list = new ArrayList<BaseUserPost>();
			for (Long postId : posts) {
				list.add(new BaseUserPost().setUserId(baseUser.getId()).setPostId(postId));
			}
			if (list.size() > 0) {
				userPostMapper.batchInsertUserPost(list);
			}
		}
	}

	/**
	 * 更新用户信息
	 * 
	 * @param baseUser 用户对象
	 */
	public void updateUser(BaseUser baseUser) {
		Long userId = baseUser.getId();
		// 删除用户角色关联
		userRoleMapper.deleteByExample(Example.builder(BaseUserRole.class).where(WeekendSqls.custom().andEqualTo("userId", userId)).build());
		// 删除用户岗位关联
		userPostMapper.deleteByExample(Example.builder(BaseUserPost.class).where(WeekendSqls.custom().andEqualTo("userId", userId)).build());
		// 新增用户角色关联
		this.insertUserRole(baseUser);
		// 新增用户岗位关联
		this.insertUserPost(baseUser);
		// 填充注入数据库基础字段信息
		EntityHelper.assembleUpdFields(baseUser);
		// 更新用户信息
		userMapper.updateByPrimaryKeySelective(baseUser);
	}

	/**
	 * 批量删除用户信息
	 * 
	 * @param ids id数组
	 * @return 结果
	 */
	public int deleteByIds(long[] ids) {
		// 批量删除用户角色关联信息
		userRoleMapper.deleteUserRole(ids);
		// 批量删除用户岗位关联信息
		userPostMapper.batchDeleteUserPost(ids);
		// 批量删除用户信息
		return userMapper.batchDeleteUserByIds(ids);
	}

	/**
	 * 通过用户id查询用户信息、以及关联的角色、岗位信息
	 *
	 * @param id 用户
	 * @return 用户信息
	 */
	public BaseUser getUserById(Long id) {
		return userMapper.selectUserById(id);
	}

	/**
	 * 根据电话或者昵称搜索用户
	 *
	 * @param phone 用户电话
	 * @return 用户信息列表
	 */
	public List<BaseUser> selectByUserList(String phone) {
		return userMapper.selectByUserList(phone);
	}

	/**
	 * 获取用户信息、权限信息
	 * 
	 * @param token 令牌
	 */
	// public FrontUser getUserInfo(String token) throws Exception {
	// String username = userAuthUtil.getInfoFromToken(token).getUniqueName();
	// if (StringUtils.isEmpty(username)) {
	// return null;
	// }
	// BaseUser user = this.getUserByUsername(username);
	// FrontUser frontUser = new FrontUser();
	// BeanUtils.copyProperties(user, frontUser);
	// frontUser.setId(user.getId() + "");
	// return frontUser;
	// }

	/**
	 * 通过用户账号查询用户信息
	 *
	 * @param account 用户账号
	 * @return
	 */
	public BaseUser getUserByAccount(String account) {
		return userMapper.selectUserByAccount(account);
	}
}
